// 2013-9-14下午12:11:01  net.betou.core.service.impl.AgencyListener.java

package net.betou.core.service.impl;

import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.Map.Entry;

import net.betou.core.entity.ConfigLogin;
import net.betou.core.service.AgencyOrProxyAbstract;
import net.betou.trade.entity.main.AgentAndAdmins;
import net.betou.trade.entity.main.Role;
import net.betou.trade.entity.main.RoleExt;
import net.betou.trade.main.manager.RoleExtMng;
import net.betou.trade.main.manager.role.AgencyRoleMng;
import net.betou.trade.web.DBConstants;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * 添加完机构的时候，一定要初始化的角色为..机构和代理商，其余的角色为可选
 * 添加代理商的时候，不需要的角色为机构和代理商
 * 
 * 判断字段为，allowRead, allowInit 
 * 添加机构， 只需找出allowInit为true
 * 添加代理商，只需要找出allowRead为false，allowInit为true的
 * 
 * @author 叶装装
 */
@Component
public class AgencyListener extends AgencyOrProxyAbstract{

	public void afterSave( AgentAndAdmins bean ){
		
		List< Role > roleList = getList( null );
		
		if( roleList == null || roleList.size( ) == 0 ){
			return;
		}
		
	
		Role agencyRole = null;
		
		String viewRoles = "";
		
		for( Role role : roleList ){
			// copy role... 
			role = copyRole( role, bean ); // 复制角色
			
			// 查看角色是否为代理商角色, 是的话，就要给他们默认的共享设置
			saveDefaultShares( role );
			
			role = mng.save( role ); // 保存角色
			
			// 保存完毕之后，查看是否为机构角色，是的话，就更新当前添加的机构为自己的机构角色
			if( DBConstants.DEFINED_AGENCY_IDENTITY.equals( role.getIdentity( ) )){
				bean.getRoles( ).clear( );
				bean.addToRoles( role ); // 更新角色
				
				agencyRole = role;
			}
			
			viewRoles += role.getId( ) + ",";
			
			// 得到代理商角色
//			if( DBConstants.DEFINED_PROXY_IDENTITY.equals( role.getIdentity( ) )){
//				//proxyRole = role;
//			}
		}
		
		initDefaultPermission( agencyRole, viewRoles );
		
	}
	
	/**
	 * 是代理商角色
	 * 1. 共享设置
	 * @param role
	 */
	private void saveDefaultShares( Role role ){
		if( DBConstants.DEFINED_PROXY_IDENTITY.equals( role.getIdentity( ) )){
			Set< String > shares =  new HashSet< String >( );
			
			shares.add( ConfigLogin.CONFIG_NOTICE ); // 公告
			shares.add( ConfigLogin.CONFIG_TRADE );  // 开仓 
			shares.add( ConfigLogin.CONFIG_CONTENT ); // 内容
			shares.add( ConfigLogin.CONFIG_CLOSE_TRADE ); // 平仓
			
			role.setShares( shares );
		}
	}
	
	/**
	 * 要初始化机构可以看到他直属角色的内容，如代理商， 他下面的新闻编辑
	 * @param agencyRole
	 * @param proxyRole
	 */
	private void initDefaultPermission( Role agencyRole, String viewRoles ){
		
		if( agencyRole == null || StringUtils.isBlank( viewRoles ) ){
			return;
		}
		
		viewRoles = viewRoles.substring( 0, viewRoles.length( ) - 1 ); // 去除最后一个逗号
		
		Set< RoleExt > roleSet = new HashSet< RoleExt >( );
		Set< Entry< String, String >> entrySet = ConfigLogin.roleExtMap.entrySet( );
		Iterator< Entry< String, String >> it = entrySet.iterator( );
		
		while( it.hasNext( ) ){
			
			Entry< String, String > entry = it.next( );
			RoleExt ext = new RoleExt( );

			ext.setKey( entry.getKey( ) );
			ext.setDescription( entry.getValue( ) );
			ext.init( );
			ext.setFindDeep( 10000 );
			ext.setViewRoles( viewRoles );
			
			ext = extMng.save( ext, agencyRole );
			roleSet.add( ext );
		}
		
		agencyRole.setRoleExt( roleSet );
		
		
//		RoleExt ext = new RoleExt( );
//
//		ext.setKey( ConfigLogin.CONFIG_AGENT );
//		ext.setDescription( ConfigLogin.roleExtMap.get( ConfigLogin.CONFIG_AGENT ) );
//		ext.init( );
//		ext.setFindDeep( 10000 );
//		
//		ext.setViewRoles( proxyRole.getId( ).toString( ) );
//		
//		Set< RoleExt > exts = new HashSet< RoleExt >( );
//		
//		exts.add( ext );
//		extMng.save( ext, agencyRole );
//		
//		agencyRole.setRoleExt( exts );
	}
	
	@Autowired
	private AgencyRoleMng mng;
	
	@Autowired
	private RoleExtMng extMng;
	
}
